package com.example.hangzhou.welbeing.mytestdemoapp.activity;
import android.net.http.SslError;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import com.example.hangzhou.welbeing.mytestdemoapp.R;
import butterknife.Bind;
import butterknife.ButterKnife;
import static android.view.KeyEvent.KEYCODE_BACK;
/**
 * 杭州惟君医疗科技有限公司10
 * Created by 20433 on 2018/4/8
 *
 * @desc 东风山河绿，春已不折柳，繁花看不尽，处处惹人留
 * @desc 佛祖镇楼，bug辟容易
 */
public class MyTwoActivity extends AppCompatActivity {
    @Bind(R.id.activity_my_two_layout)
    ConstraintLayout activityMyTwoLayout;
    private WebView mWebView;
    private int intsteps;
    private WebSettings webSettings;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_two);
        ButterKnife.bind(this);
        initWebView();
        getWebViewTitle();
        setWebViewOther();
        MyWebSettings();
        setWebViewCache();
        myWebViewClient();
        loadError();
        requestHttps();
    }
   //处理https请求 webView默认是不处理https请求的，页面显示空白，需要进行如下设置：
    private void requestHttps() {
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();    //表示等待证书响应
                // handler.cancel();      //表示挂起连接，为默认方式
                // handler.handleMessage(null);    //可做其他处理
            }
        });
    }
    //加载页面的服务器出现错误时（如404）调用。
    //App里面使用webview控件的时候遇到了诸如404这类的错误的时候，若也显示浏览器里面的那种错误提示页面就显得很丑陋了，
    // 那么这个时候我们的app就需要加载一个本地的错误提示页面，即webview如何加载一个本地的页面
    private void loadError() {
        //步骤1：写一个html文件（error_handle.html），用于出错时展示给用户看的提示页面
        //步骤2：将该html文件放置到代码根目录的assets文件夹下
        //步骤3：复写WebViewClient的onRecievedError方法
        //该方法传回了错误码，根据错误类型可以进行不同的错误分类处理
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
                switch(errorCode)
                {
//                    case HttpStatus.SC_NOT_FOUND:
//                        view.loadUrl("file:///android_assets/error_handle.html");
//                        break;
                }
            }
        });
    }
    //处理各种通知 & 请求事件
    //
    private void myWebViewClient() {
        //步骤2. 选择加载方式
        //方式1. 加载一个网页：
        mWebView.loadUrl("http://www.google.com/");
        //方式2：加载apk包中的html页面
        mWebView.loadUrl("file:///android_asset/test.html");
        //方式3：加载手机本地的html页面
        mWebView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");
        //步骤3. 复写shouldOverrideUrlLoading()方法，使得打开网页时不调用系统浏览器， 而是在本WebView中显示
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
    }
    //设置WebView缓存   当加载 html 页面时，WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹
    // 请求的 URL记录保存在 WebViewCache.db，而 URL的内容是保存在 WebViewCache 文件夹下
    private void setWebViewCache() {
        //缓存模式如下：
        //LOAD_CACHE_ONLY: 不使用网络，只读取本地缓存数据
        //LOAD_DEFAULT: （默认）根据cache-control决定是否从网络上取数据。
        //LOAD_NO_CACHE: 不使用缓存，只从网络获取数据.
        //LOAD_CACHE_ELSE_NETWORK，只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。
//        if (NetStatusUtil.isConnected(getApplicationContext())) {
//            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);//根据cache-control决定是否从网络上取数据。
//        } else {
//            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//没网，则从本地获取，即离线加载
//        }
        webSettings.setDomStorageEnabled(true); // 开启 DOM storage API 功能
        webSettings.setDatabaseEnabled(true);   //开启 database storage API 功能
        webSettings.setAppCacheEnabled(true);//开启 Application Caches 功能

        String cacheDirPath = getFilesDir().getAbsolutePath() ;
        webSettings.setAppCachePath(cacheDirPath); //设置  Application Caches 缓存目录
    }

    //进行配置-利用WebSettings子类（常见方法）
    private void MyWebSettings() {
        //声明WebSettings子类
        webSettings = mWebView.getSettings();
        //如果访问的页面中要与Javascript交互，则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);
        //设置自适应屏幕，两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        //缩放操作
        webSettings.setSupportZoom(true); //支持缩放，默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false，则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
        //其他细节操作
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
    }
    private void setWebViewOther() {
        //TODO 关于前进 / 后退网页
        //是否可以后退
        mWebView.canGoBack();
        //后退网页
        mWebView.goBack();
        //是否可以前进
        mWebView.canGoForward();
        //前进网页
        mWebView.goForward();
        //以当前的index为起始点前进或者后退到历史记录中指定的steps   如果steps为负数则为后退，正数则为前进
        mWebView.goBackOrForward(intsteps);
        // todo 清除缓存数据
        //清除网页访问留下的缓存   由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
        mWebView.clearCache(true);
        //清除当前webview访问的历史记录  只会webview访问历史记录里的所有记录除了当前访问记录
        mWebView.clearHistory();
       //这个api仅仅清除自动完成填充的表单数据，并不会清除WebView存储到本地的数据
        mWebView.clearFormData();
    }
    //获取Web页中的标题
    private void getWebViewTitle() {
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onReceivedTitle(WebView view, String title) {
               // titleview.setText(title);
            }
        });
    }
    private void initWebView() {
        //注意事项：如何避免WebView内存泄露？ 不在xml中定义 Webview ，而是在需要的时候在Activity中创建，并且Context使用 getApplicationgContext()
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        mWebView = new WebView(getApplicationContext());
        mWebView.setLayoutParams(params);
        activityMyTwoLayout.addView(mWebView);
    }
    @Override
    protected void onResume() {
        super.onResume();
        //激活WebView为活跃状态，能正常执行网页的响应
        mWebView.onResume();
        //恢复pauseTimers状态
        mWebView.resumeTimers();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //当页面被失去焦点被切换到后台不可见状态，需要执行onPause  通过onPause动作通知内核暂停所有的动作，比如DOM的解析、plugin的执行、JavaScript执行。
        mWebView.onPause();
       //当应用程序(存在webview)被切换到后台时，这个方法不仅仅针对当前的webview而是全局的全应用程序的webview  它会暂停所有webview的layout，parsing，javascripttimer。降低CPU功耗。
        mWebView.pauseTimers();
    }
    @Override
    protected void onDestroy() {
        //在 Activity 销毁（ WebView ）的时候，先让 WebView 加载null内容，然后移除 WebView，再销毁 WebView，最后置空。
        if (mWebView != null) {
            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebView.clearHistory();

            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}
